%{
#include <kuai/misc/xyz.hpp>
%}

namespace kuai {

	struct XYZ {
		XYZ();
		XYZ(RealNumber x0, RealNumber y0, RealNumber z0);
		XYZ(const XYZ& v1, const XYZ& v2);

		RealNumber x, y, z;
		
		XYZ& operator+=(const XYZ& v1);
		XYZ& operator-=(const XYZ& v1);
		XYZ& operator*=(const XYZ& v1);
		XYZ& operator*=(const RealNumber& v1);
		XYZ& operator/=(const RealNumber& v1);
		
		RealNumber abs() const;
		XYZ operator-() const;
		
		XYZ operator+(const XYZ& v2) const;
		XYZ operator-(const XYZ& v2) const;
		XYZ operator*(const XYZ& v2) const;
		XYZ operator*(const RealNumber& v2) const;
		XYZ operator/(const RealNumber& v2) const;
		
		bool operator==(const XYZ& v2) const;
		bool operator!=(const XYZ& v2) const;
	};	
	
	%extend XYZ {
		String __str__() {
			return str(*$self);
		}
		
		RealNumber __abs__() const {
			return $self->abs();
		}
	};
	
	inline RealNumber abs(const XYZ& v1) {
		return v1.abs();
	};
	
	RealNumber dot(const XYZ& v1, const XYZ& v2);
	
	RealNumber angle(const XYZ& v1, const XYZ& v2);
	RealNumber angle(const XYZ& v1, const XYZ& v2, const XYZ& v3);
	RealNumber torsion(const XYZ& v1, const XYZ& v2, const XYZ& v3, const XYZ& v4);


	XYZ rotate(const XYZ& v0,  const XYZ& vAxis, RealNumber angle);
	XYZ rotate(const XYZ& v0,  const XYZ& vAxis1, const XYZ& vAxis2, RealNumber angle);
	
}

